home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Python 1.4 / twit / mactwit_app.py < prev    next >
Encoding:
Python Source  |  1996-09-26  |  6.6 KB  |  253 lines  |  [TEXT/Pyth]

  1. import FrameWork
  2. import MiniAEFrame
  3. import EasyDialogs
  4. import AE
  5. import AppleEvents
  6. import Res
  7. import sys
  8. import Qd
  9. import Evt
  10. import Events
  11. import Dlg
  12. import Win
  13. import Menu
  14. import TwitCore
  15. import mactwit_mod
  16. import mactwit_stack
  17. import mactwit_browser
  18. import mactwit_edit
  19. import macfs
  20.  
  21. # Resource-id (for checking existence)
  22. ID_MODULES=512
  23.  
  24. ID_ABOUT=515
  25.  
  26. _arrow = Qd.qd.arrow
  27. _watch = Qd.GetCursor(4).data
  28.  
  29. class Twit(FrameWork.Application, TwitCore.Application, MiniAEFrame.AEServer):
  30.     """The twit main class - mac-dependent part"""
  31.  
  32.     def __init__(self, sessiontype, arg=None):
  33.         # First init menus, etc.
  34.         self.app_menu_bar = Menu.GetMenuBar()
  35.         FrameWork.Application.__init__(self)
  36.         MiniAEFrame.AEServer.__init__(self)
  37.         AE.AESetInteractionAllowed(AppleEvents.kAEInteractWithAll)
  38.         self.installaehandler('aevt', 'odoc', self.ae_open_doc)
  39.         self.installaehandler('aevt', 'quit', self.do_quit)
  40.  
  41.         self.dbg_menu_bar = Menu.GetMenuBar()
  42.         self.setstate(sessiontype)
  43.         self._quitting = 0
  44.         self.real_quit = 0
  45.         self.window_aware = 1
  46.  
  47.         # Next create our dialogs
  48.         self.mi_init(sessiontype, arg)
  49.         while 1:
  50.             if self.real_quit:
  51.                 break
  52.             if self.initial_cmd:
  53.                 self.to_debugger()    # Will get to mainloop via debugger
  54.             else:
  55.                 self.one_mainloop()    # Else do it ourselves.
  56.                 
  57.     def switch_to_app(self):
  58.         if not self.window_aware:
  59.             return
  60.         self.dbg_menu_bar = Menu.GetMenuBar()
  61.         Menu.SetMenuBar(self.app_menu_bar)
  62.         Menu.DrawMenuBar()
  63.         
  64.     def switch_to_dbg(self):
  65.         if not self.window_aware:
  66.             return
  67.         self.app_menu_bar = Menu.GetMenuBar()
  68.         Menu.SetMenuBar(self.dbg_menu_bar)
  69.         Menu.DrawMenuBar()
  70.         self.run_dialog.force_redraw()
  71.         if self.module_dialog:
  72.             self.module_dialog.force_redraw()
  73.  
  74.     def makeusermenus(self):
  75.         self.filemenu = m = FrameWork.Menu(self.menubar, "Debug")
  76.         self._openitem = FrameWork.MenuItem(m, "Run File...", "O", self.do_open)
  77.         self._runitem = FrameWork.MenuItem(m, "Run String...", "R", self.do_run)
  78.         FrameWork.Separator(m)
  79.         self._awareitem = FrameWork.MenuItem(m, "Window-aware", "", self.do_aware)
  80.         self._awareitem.check(1)
  81.         FrameWork.Separator(m)
  82.         self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self.do_quit)
  83.         
  84.         self.controlmenu = m = FrameWork.Menu(self.menubar, "Control")
  85.         self._stepitem = FrameWork.MenuItem(m, "Step Next", "N", self.do_step)
  86.         self._stepinitem = FrameWork.MenuItem(m, "Step In", "S", self.do_stepin)
  87.         self._stepoutitem = FrameWork.MenuItem(m, "Step Out", "U", self.do_stepout)
  88.         self._continueitem = FrameWork.MenuItem(m, "Continue", "G", self.do_continue)
  89.         FrameWork.Separator(m)
  90.         self._killitem = FrameWork.MenuItem(m, "Kill", "K", self.do_kill)
  91.         
  92.     def setstate(self, state):
  93.         self.state = state
  94.         if state == 'run':
  95.             self._stepitem.enable(1)
  96.             self._stepoutitem.enable(1)
  97.             self._stepinitem.enable(1)
  98.             self._continueitem.enable(1)
  99.             self._killitem.enable(1)
  100.         else:
  101.             self._stepitem.enable(0)
  102.             self._stepoutitem.enable(0)
  103.             self._stepinitem.enable(0)
  104.             self._continueitem.enable(0)
  105.             self._killitem.enable(0)
  106.             
  107.     def asknewsession(self):
  108.         if self.state == 'none':
  109.             return 1
  110.         if EasyDialogs.AskYesNoCancel("Abort current debug session?") == 1:
  111.             self.quit_bdb()
  112.             return 1
  113.         return 0
  114.  
  115.     def do_about(self, id, item, window, event):
  116.         import time
  117.         d = Dlg.GetNewDialog(ID_ABOUT, -1)
  118.         if not d:
  119.             return
  120.         w = d.GetDialogWindow()
  121.         port = w.GetWindowPort()
  122.         l, t, r, b = port.portRect
  123.         sl, st, sr, sb = Qd.qd.screenBits.bounds
  124.         x = ((sr-sl) - (r-l)) / 2
  125.         y = ((sb-st-16) - (b-t)) / 5
  126.         w.MoveWindow(x, y, 0)
  127.         w.ShowWindow()
  128.         d.DrawDialog()
  129.         
  130.         tp, h, rect = d.GetDialogItem(2)
  131.         x0, y0, x1, y1 = rect
  132.         ybot = y0 + 32
  133.         
  134.         rgn = Qd.NewRgn()
  135.         Qd.SetPort(d)
  136.         ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 1)
  137.         if ok: return
  138.         (what, message, when, where, modifiers) = event
  139.         delta_t = 128
  140.         nexttime = when+delta_t
  141.         while ybot < y1:
  142.             # Do the animation, if it is time
  143.             if when > nexttime:
  144.                 Qd.ScrollRect((x0, y0, x1, ybot), 0, 1, rgn)
  145.                 y0 = y0 + 1
  146.                 ybot = ybot + 1
  147.                 # And update next time
  148.                 delta_t = int(delta_t*0.6)-1
  149.                 if delta_t < 0:
  150.                     delta_t = 0
  151.                 nexttime = when + delta_t
  152.             # Check for an event.
  153.             ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 0)
  154.             if ok: return
  155.             (what, message, when, where, modifiers) = evt
  156.         while 1:
  157.             ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, -1)
  158.             if ok: return
  159.             
  160.     def do_open(self, *args):
  161.         if not self.asknewsession():
  162.             return
  163.         fss, ok = macfs.StandardGetFile('TEXT')
  164.         if not ok: return
  165.         self.runfile(fss.as_pathname())
  166.         
  167.     def ae_open_doc(self, object=None, **args):
  168.         if not object: return
  169.         if self.state <> 'none':
  170.             if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
  171.                 if not self.asknewsession():
  172.                     return
  173.         if type(object) == type([]):
  174.             object = object[0]
  175.         fss, changed = object.Resolve()
  176.         self.runfile(fss.as_pathname())
  177.         
  178.     def do_run(self, *args):
  179.         if not self.asknewsession():
  180.             return
  181.         self.run()
  182.         
  183.     def do_aware(self, *args):
  184.         self.window_aware = not self.window_aware
  185.         self._awareitem.check(self.window_aware)
  186.         
  187.     def do_quit(self, *args):
  188.         self._quit()            # Signal FrameWork.Application to stop
  189.         self.real_quit = 1
  190.         self.quit_bdb()            # Tell debugger to quit.
  191.  
  192.     def do_step(self, *args):
  193.         self.run_dialog.click_step()
  194.         
  195.     def do_stepin(self, *args):
  196.         self.run_dialog.click_step_in()
  197.         
  198.     def do_stepout(self, *args):
  199.         self.run_dialog.click_step_out()
  200.         
  201.     def do_continue(self, *args):
  202.         self.run_dialog.click_continue()
  203.         
  204.     def do_kill(self, *args):
  205.         self.run_dialog.click_kill()
  206.                     
  207.     def exit_mainloop(self):
  208.         self._quit()            # Signal FrameWork.Application to stop
  209.         self.real_quit = 0
  210.         
  211.     def one_mainloop(self):
  212.         self.quitting = 0
  213.         self.mainloop()
  214.  
  215.     def SetCursor(self):
  216.         Qd.SetCursor(_arrow)
  217.     
  218.     def SetWatch(self):
  219.         Qd.SetCursor(_watch)
  220.         
  221.     def AskString(self, *args):
  222.         return apply(EasyDialogs.AskString, args)
  223.         
  224.     def Message(self, *args):
  225.         return apply(EasyDialogs.Message, args)
  226.  
  227.     def new_module_browser(self, parent):
  228.         return mactwit_mod.ModuleBrowser(parent)
  229.         
  230.     def new_stack_browser(self, parent):
  231.         return mactwit_stack.StackBrowser(parent)
  232.         
  233.     def new_var_browser(self, parent, var):
  234.         return mactwit_browser.VarBrowser(parent).open(var)
  235.     
  236.     def edit(self, file, line):
  237.         return mactwit_edit(file, line)
  238.     
  239.         
  240. def Initialize():
  241.     try:
  242.         # if this doesn't raise an error, we are an applet containing the 
  243.         # necessary resources or we have been initialized already
  244.         # so we don't have to bother opening the resource file
  245.         dummy = Res.GetResource('DLOG', ID_MODULES)
  246.     except Res.Error:
  247.         try:
  248.             Res.OpenResFile("Twit.rsrc")
  249.         except Res.Error, arg:
  250.             EasyDialogs.Message("Cannot open Twit.rsrc: "+arg[1])
  251.             sys.exit(1)
  252.  
  253.